﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Db4objects.Db4o;
using Db4objects.Db4o.Linq;
using Domain; 

namespace DAO
{
    public static class PublicacionDAO
    { 
        public static List<Publicacion> Traer(long? id, string descripcion, Publicacion.enum_Publicacion_Estado? idestado)
        {
            descripcion = descripcion == null ? null : descripcion.ToUpper();
            

            using (IObjectContainer db = Connect.getDataBase())
            {
                try
                {
                    List<Publicacion> lst = (from Empresa e in db
                                              from p in e.Publicaciones
                                              where
                                              (!id.HasValue || id.Value == p.Id) &&
                                              (string.IsNullOrEmpty(descripcion) || p.Descripcion.ToUpper().Contains(descripcion))  &&
                                              (!idestado.HasValue || idestado.Value == p.Estado)
                                              select p).ToList<Publicacion>();

                    Connect.lstAssignId(db, lst.AsQueryable().OfType<object>().ToList());
                    return lst;

                }
                finally
                {
                    db.Close();
                }
            }    
        }

        public static bool Guardar(Publicacion publicacion)
        {
            using (IObjectContainer db = Connect.getDataBase())
            {
                try
                {
                    if (publicacion.db4oid.HasValue)
                    {
                        Connect.rebindId(db, (object)publicacion);
                    }

                    if(publicacion.Id == 0)
                        publicacion.Id = IncrementalDAO.Incrementar(enum_Tipo_Incremental.Publicacion); 

                    db.Store(publicacion);
                    db.Commit();
                }
                finally
                {
                    db.Close();
                }
            }
            return true;
        }

        public static long? GuardarPublicacion(Empresa empresa, Publicacion publicacion)
        {
            long? rta = null;

            using (IObjectContainer db = Connect.getDataBase())
            {
                try
                {
                    if (publicacion.Id == 0)
                    {
                        publicacion.Id = IncrementalDAO.Incrementar(enum_Tipo_Incremental.Publicacion);
                        empresa.Publicaciones.Add(publicacion);
                        EmpresaDAO.Guardar(empresa);
                        rta = publicacion.Id;
                    }
                    else
                    {
                        PublicacionDAO.Guardar(publicacion);
                        rta = publicacion.Id;
                    }



                    db.Commit();
                }
                finally
                {
                    db.Close();
                }
            }
            // Envio mails a todos los seguidores de la publicacion/empresa
            List<Usuario> seg = UsuarioDAO.TraerSeguidoresDe(empresa.UserName, publicacion.Id);
            seg.ForEach(delegate(Usuario u)
            {
                Email.goSendPublicacion(publicacion.Id, u);
            });

            return rta;
        }


        public static bool AnularPublicacion(long idpublicacion)
        {
            using (IObjectContainer db = Connect.getDataBase())
            {
                try
                {
                    List<Publicacion> p = Traer(idpublicacion, null, Publicacion.enum_Publicacion_Estado.Publicada);

                    if (p.Count() < 0 || p.Count() > 1)
                        return false;

                    Publicacion pub = p.First();
                    pub.FechaAnulacion = DateTime.Now;
                    return Guardar(pub);
                }
                finally
                {
                    db.Close();
                }
            }
        }

        public static bool BajaPublicacion(long idpublicacion, long idempresa)
        {
            using (IObjectContainer db = Connect.getDataBase())
            {
                try
                {
                    List<Publicacion> p = Traer(idpublicacion, null, Publicacion.enum_Publicacion_Estado.Publicada);

                    if (p.Count() < 0 || p.Count() > 1)
                        return false;

                    Publicacion pub = p.First();
                    pub.FechaBaja = DateTime.Now;
                    Guardar(pub);
                }
                finally
                {
                    db.Close();
                }
            }


            // Envio mails a todos los seguidores de la publicacion/empresa
            List<Usuario> seg = UsuarioDAO.TraerSeguidoresDe(idempresa, idpublicacion);
            seg.ForEach(delegate(Usuario u)
            {
                Email.goSendPublicacion(idpublicacion, u);
            });

            return true;

        }

    }
}
